mod reg_util;

use winapi::um::winreg::HKEY_CURRENT_USER;
use std::process::{Command, exit};
use std::time::Duration;
use winapi::shared::winerror::SEC_E_OK;

#[cfg(windows)]
fn main() {
    println!(">>>>>>>>>>>>>>>>>>>>Windows 11 任务栏位置调整工具 V1.0<<<<<<<<<<<<<<<<<<<<<<<<");
    println!("****************************************************************************");
    println!("*                                                                           ");
    println!("* 该工具仅适用于 Windows11 如果在其它系统上使用导致出现问题，作者概不负责         ");
    println!("*                                                                           ");
    println!("* 该工具使用前请先备份注册表！");
    println!("* 该工具使用前请先备份注册表！");
    println!("* 该工具使用前请先备份注册表！");
    println!("*                                                                           ");
    println!("* 作者：我是小学生                                                           ");
    println!("* 时间：2021年10月7日11:13:55                                               ");
    println!("* 该工具使用Rust语言构建                                                     ");
    println!("*                                                                          ");
    println!("****************************************************************************");

    // 任务栏的位置
    const LEFT: &u8 = &(0 as u8);
    const UP: &u8 = &(1 as u8);
    const RIGHT: &u8 = &(2 as u8);
    const DOWN: &u8 = &(3 as u8);

    const SUB_KEY: &str = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StuckRects3";
    const ITEM_KEY: &str = "Settings";
    // 打开注册表
    let hkey_result = reg_util::reg_open(HKEY_CURRENT_USER, SUB_KEY);
    match hkey_result {
        Ok(hkey) => {
            // dbg!(hkey);
            // 打开注册表成功
            // 读取数据
            // 数据是二进制数据
            // 判断第12个数据，如果是0x00 则表示左，0x01 则表示上，0x02 则表示右，0x03 则表示下
            let mut reg_value = reg_util::reg_query_binary(&hkey, ITEM_KEY);
            let position_option = reg_value.get(12);
            match position_option {
                Some(LEFT) => {
                    println!("【当前任务栏的位置在屏幕左侧！】");
                }
                Some(RIGHT) => {
                    println!("【当前任务栏的位置在屏幕右侧！】");
                }
                Some(UP) => {
                    println!("【当前任务栏的位置在屏幕上方！】");
                }
                Some(DOWN) => {
                    println!("【当前任务栏的位置在屏幕下方！】");
                }
                Some(_) => {
                    println!("【读取任务栏的位置失败！UNKNOWN】");
                    return;
                }
                None => {
                    println!("【读取任务栏的位置失败！NONE】");
                    return;
                }
            }
            let position = input_task_bar_position();
            if position > 3 {
                println!("输入错误！");
                return;
            }

            // 正确输入，构建二进制值
            reg_value[12] = position;
            // 保存注册表
            let status = reg_util::reg_save_binary(&hkey, ITEM_KEY, &mut reg_value);
            if status == SEC_E_OK {
                println!("修改成功！正在重启资源管理器......");
                reboot_explorer();
                println!("重启资源管理器成功！");
                exit(0);
            } else {
                println!("修改失败！");
            }
        }
        Err(msg) => {
            println!("Open Reg Error: => {}", msg);
        }
    }
}


/// 输入要修改的位置
fn input_task_bar_position() -> u8 {
    println!("\n请输入要更改任务栏的位置：");
    println!("注：0 表示左，1 表示上，2 表示右，3 表示下，其它输入无效！");
    let mut input_data = String::new();
    std::io::stdin().read_line(&mut input_data).expect("read line error!");
    match input_data.trim().parse::<u8>() {
        Ok(data) => {
            return data;
        }
        Err(_) => {
            println!("输入错误！");
        }
    }
    return 0xff as u8;
}

/// 重启资源管理器
fn reboot_explorer() {
    let _ = Command::new("cmd.exe").arg("/c").arg("taskkill /im explorer.exe /f").output();
    std::thread::sleep(Duration::from_secs(1));
    let _ = Command::new("cmd.exe").arg("/c").arg("explorer.exe").spawn();
}
